package org.fixies.spreadsheet;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class ParameterMap extends HashMap<String, Cell> {

    /**
     * SUID
     */
    private static final long serialVersionUID = 1L;

    /**
     * コンストラクタ
     */
    public ParameterMap() {
        super();
    }


    /**
     * コンストラクタ
     *
     * @param initialCapacity 初期容量
     * @param loadFactor      負荷係数
     */
    public ParameterMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
    }


    /**
     * コンストラクタ
     *
     * @param initialCapacity 負荷係数
     */
    public ParameterMap(int initialCapacity) {
        super(initialCapacity);
    }


    /**
     * コンストラクタ
     *
     * @param m マップ
     */
    public ParameterMap(Map<? extends String, ? extends Cell> m) {
        super(m);
    }


    /**
     * セルの内容をObjectとして返却する。<br/>
     * 実体は文字列
     *
     * @param key キー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell
     */
    public Object asObject(String key) {
        return getCell(key).asString();
    }


    /**
     * セルの内容を文字列として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asString()
     */
    public String asString(String key) {
        return getCell(key).asString();
    }


    /**
     * セルの内容をshort型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asShort()
     */
    public short asShort(String key) {
        return getCell(key).asShort();
    }


    /**
     * セルの内容をint型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asInt()
     */
    public int asInt(String key) {
        return getCell(key).asInt();
    }


    /**
     * セルの内容をlong型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asLong()
     */
    public long asLong(String key) {
        return getCell(key).asLong();
    }


    /**
     * セルの内容をfloat型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asFloat()
     */
    public float asFloat(String key) {
        return getCell(key).asFloat();
    }


    /**
     * セルの内容をdouble型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asDouble()
     */
    public double asDouble(String key) {
        return getCell(key).asDouble();
    }


    /**
     * セルの内容を16進数とみなし、byte型に変換して返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asByte()
     */
    public byte asByte(String key) {
        return getCell(key).asByte();
    }


    /**
     * セルの内容を16進数とみなし、byte型の配列に変換して返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asBytes()
     */
    public byte[] asBytes(String key) {
        return getCell(key).asBytes();
    }


    /**
     * セルの内容をBigDecimal型の数値として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asBigDecimal()
     */
    public BigDecimal asBigDecimal(String key) {
        return getCell(key).asBigDecimal();
    }


    /**
     * セルの内容を日付として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asDate()
     */
    public Date asDate(String key) {
        return getCell(key).asDate();
    }


    /**
     * セルの内容をboolean型として返却する。<br/>
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asBoolean()
     */
    public boolean asBoolean(String key) {
        return getCell(key).asBoolean();
    }


    /**
     * セルの内容を文字列として返却する。<br/>
     * セルの内容が"null”という文字列であった場合は、nullを返却する。
     *
     * @param key セルを特定するためのキー
     * @return セルの内容
     * @see org.fixies.spreadsheet.Cell#asStringOrNull()
     */
    public String asStringOrNull(String key) {
        return getCell(key).asStringOrNull();
    }


    /**
     * セルの内容が空であるかどうか判定する。
     *
     * @param key セルを特定するためのキー
     * @return 判定結果
     * @see org.fixies.spreadsheet.Cell#isEmpty()
     */
    public boolean isEmpty(String key) {
        return getCell(key).isEmpty();
    }


    /**
     * セルの内容がnullであるかどうか判定する。<br/>
     * セルの内容が"null”という文字列であった場合は真を返却する。
     *
     * @param key セルを特定するためのキー
     * @return 判定結果
     * @see org.fixies.spreadsheet.Cell#isNull()
     */
    public boolean isNull(String key) {
        return getCell(key).isNull();
    }

    private Cell getCell(String key) {
        return get(key);
    }

}
